The aim of the osbma R package is to predict overall survival in solid tumor oncology studies using joint models combined through Bayesian model averaging.
In solid tumor oncology studies, overall survival (OS) is the definitive endpoint for accessing patient benefit. Reliable OS predictions are very valuable for both drug development and patients’ end-of-life medical care. Existing methods often ignore the underlying process of tumor burden measurements and incur “information loss”. Motivated by an advanced renal cell carcinoma (RCC) clinical trial, in this paper, we propose a multivariate joint modeling approach to assess the underlying dynamics of the progression-free survival (PFS) components to forecast the death times of trial participants. Through Bayesian model averaging, our proposed method improves the accuracy of the OS forecast by combining joint models developed based on each granular component of PFS. A case study of the RCC trial is conducted, and our method provides the most accurate predictions across all tested scenarios. The reliability of our proposed method is also verified through extensive simulation studies, which include the scenario where OS is completely independent of PFS. Overall, the proposed methodology provides a promising candidate for reliable OS prediction in solid tumor oncology studies.
Install the development version from GitHub:
# Install devtools first if you haven't done so
library(devtools)
# install osbma
devtools::install_github("sidiwang/osbma")
library(osbma)
osbmapredict.osbmaplot.predict.dataosbma: We call the osbma function using
data from an oncology trial with 400 total individuals.
data <- osbma::data
result <- osbma::osbma(data = data, covariate = "trt", method = "rjags")
## Loading required namespace: rjags
## Compiling rjags model...
## Calling the simulation using the rjags method...
## Adapting the model for 8000 iterations...
## Burning in the model for 1000 iterations...
## Running the model for 10000 iterations...
## Simulation complete
## Note: Summary statistics were not produced as there are >50 monitored
## variables
## [To override this behaviour see ?add.summary and ?runjags.options]
## FALSEFinished running the simulation
## Calculating summary statistics...
## Calculating the Gelman-Rubin statistic for 1629 variables....
## Compiling rjags model...
## Calling the simulation using the rjags method...
## Adapting the model for 8000 iterations...
## Burning in the model for 1000 iterations...
## Running the model for 10000 iterations...
## Simulation complete
## Note: Summary statistics were not produced as there are >50 monitored
## variables
## [To override this behaviour see ?add.summary and ?runjags.options]
## FALSEFinished running the simulation
options(max.print = 40)
summary(result)
##
## Iterations = 9001:18991
## Thinning interval = 10
## Number of chains = 2
## Sample size per chain = 1000
##
## 1. Empirical mean and standard deviation for each variable,
## plus standard error of the mean:
##
## Mean SD Naive SE Time-series SE
## beta_0[1] 4.459e+01 9.631e-01 2.153e-02 1.061e-01
## beta_0[2] -3.287e-01 7.900e-02 1.766e-03 6.975e-03
## beta_1[1] 4.660e+00 1.045e-01 2.337e-03 9.505e-03
## beta_1[2] -1.169e+00 6.371e-02 1.425e-03 5.751e-03
## lambda 5.613e-03 6.683e-04 1.494e-05 3.570e-05
## alpha_os.1 2.684e+00 2.573e-01 5.754e-03 1.540e-02
## eta_2 2.304e-01 1.926e-02 4.306e-04 0.000e+00
## alpha_2 1.903e-01 8.476e-02 1.895e-03 0.000e+00
## beta_2[1] -1.594e-01 1.460e-01 3.264e-03 0.000e+00
## beta_2[2] -2.010e-01 1.348e-01 3.013e-03 0.000e+00
## [ reached getOption("max.print") -- omitted 2023 rows ]
##
## 2. Quantiles for each variable:
##
## 2.5% 25% 50% 75% 97.5%
## beta_0[1] 4.254e+01 4.400e+01 4.462e+01 4.522e+01 4.658e+01
## beta_0[2] -4.870e-01 -3.791e-01 -3.255e-01 -2.752e-01 -1.851e-01
## beta_1[1] 4.462e+00 4.587e+00 4.659e+00 4.735e+00 4.861e+00
## beta_1[2] -1.294e+00 -1.215e+00 -1.168e+00 -1.125e+00 -1.048e+00
## lambda 4.380e-03 5.162e-03 5.601e-03 6.054e-03 6.950e-03
## alpha_os.1 2.220e+00 2.507e+00 2.671e+00 2.850e+00 3.211e+00
## eta_2 2.112e-01 2.112e-01 2.304e-01 2.497e-01 2.497e-01
## alpha_2 1.055e-01 1.055e-01 1.903e-01 2.750e-01 2.750e-01
## [ reached getOption("max.print") -- omitted 2025 rows ]
predict.osbma: Here, we call the prediction function to
predict the overall survival of all patients:
prediction <- predict(result)
plot.predict.osbma: The plot function provides 3 types
of plots:
plot(prediction, trt.col.name = "trt", type = "KM")
plot(prediction, trt.col.name = "trt", type = "date")
plot(prediction, trt.col.name = "trt", type = 120)